/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servico;

import br.com.foxinline.enums.ProjetoStatus;
import br.com.foxinline.enums.Relatorios;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.modelo.Projeto;
import br.com.foxinline.modelo.Secretaria;
import br.com.foxinline.modelo.Usuario;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.Query;

/**
 *
 * @author laverson
 */
@Stateless
public class ProjetoServico extends ServicoGenerico<Projeto> {

    @EJB
    SituacaoServico situacaoServico;
    @EJB
    LancamentoServico lancamentoServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    GrupoServico grupoServico;

    public ProjetoServico() {
        super(Projeto.class);
    }

    /**
     * Pesquisar por todos os registros do Projeto. Se ambas as datas forem
     * informadas, a pesquisa busca por todos os registros que possuem data
     * entre as datas informadas. Se apenas a data inicial for informada a
     * pesquisa retorna todos os registros que possuem data igua a data
     * informada.
     *
     * @param entity
     * @param dataInicio
     * @param dataFim
     * @return
     */
    public List<Projeto> find(Projeto entity, Date dataInicio, Date dataFim) {
        Usuario usuario = usuarioServico.getCurrentUser();

        String sql = "SELECT p FROM Projeto p ";

        Pessoa empresa = entity.getEmpresa();
        if ((empresa.getNomeFantasia() != null && !empresa.getNomeFantasia().equals(""))
                || (empresa.getCnpj() != null && !empresa.getCnpj().equals(""))) {
            sql += "JOIN p.empresa e ";
        }

        if (entity.getResponsavel() != null && entity.getResponsavel().getId() != null) {
            sql += " JOIN p.responsavel r ";
        }
        Secretaria secretaria = entity.getSecretaria();

        if (secretaria != null && secretaria.getId() != null) {
            sql += "JOIN p.secretaria s ";
        }

        if (!usuarioServico.isAdmin()) {
            sql += "JOIN p.acompanhantes a ";
        }

        sql += "WHERE ";

        if (entity.getNome() != null && !entity.getNome().equals("")) {
            sql += "LOWER(p.nome) LIKE LOWER(:nome) AND ";
        }

        if (dataInicio != null && dataFim != null) {
            sql += "(p.vigenciaInicial >= :dataInicio AND p.vigenciaFinal <= :dataFim) AND ";
        }

        if (dataInicio != null && dataFim == null) {
            sql += "(p.vigenciaInicial = :dataInicio) AND ";
        }

        if (dataInicio == null && dataFim != null) {
            sql += "(p.vigenciaFinal = :dataFim) AND ";
        }

        if (entity.getResponsavel() != null && entity.getResponsavel().getId() != null) {
            sql += " r.id  = :responsavel AND ";
        }

        if (secretaria != null && secretaria.getId() != null) {
            sql += "s.id = :id AND ";
        }

        if (!usuarioServico.isAdmin()) {
            sql += "a.id = :usuarioID AND ";
        }

        if (empresa.getNomeFantasia() != null && !empresa.getNomeFantasia().equals("")) {
            sql += "lower(e.nomeFantasia) like lower(:nomeFantasia) AND ";
        }
        if (empresa.getCnpj() != null && !empresa.getCnpj().equals("")) {
            sql += "lower(e.cnpj) like lower(:cnpj) AND ";
        }

        sql += "1=1";

        System.err.println(sql);

        Query query = getEntityManager().createQuery(sql);

        if (secretaria != null && secretaria.getId() != null) {
            query.setParameter("id", secretaria.getId());
        }

        if (entity.getNome() != null && !entity.getNome().equals("")) {
            query.setParameter("nome", "%" + entity.getNome().replace(" ", "%") + "%");
        }

        if (dataInicio != null && dataFim != null) {
            query.setParameter("dataInicio", dataInicio);
            query.setParameter("dataFim", dataFim);
        }

        if (dataInicio != null && dataFim == null) {
            query.setParameter("dataInicio", dataInicio);
        }

        if (dataInicio == null && dataFim != null) {
            query.setParameter("dataFim", dataFim);
        }

        if (entity.getResponsavel() != null && entity.getResponsavel().getId() != null) {
            query.setParameter("responsavel", entity.getResponsavel().getId());
        }

        if (empresa.getNomeFantasia() != null && !empresa.getNomeFantasia().equals("")) {
            query.setParameter("nomeFantasia", empresa.getNomeFantasia());
        }
        if (empresa.getCnpj() != null && !empresa.getCnpj().equals("")) {
            query.setParameter("cnpj", empresa.getCnpj());
        }
        if (!usuarioServico.isAdmin()) {
            query.setParameter("usuarioID", usuario.getId());
        }

        return query.getResultList();
    }

    @Override
    public void salvar(Projeto entity) {

        for (Usuario usuario : entity.getAcompanhantes()) {
            if (usuario.getGrupos() == null) {
                usuario.setGrupos(new ArrayList());
            }

            usuario.getGrupos().add(grupoServico.find("visualizar_projeto"));
            usuarioServico.atualizar(usuario);

        }

        entity.setUsuario(usuarioServico.getCurrentUser());
        super.salvar(entity);

//        if (!entity.getSituacoes().isEmpty()) {
//
//            List<Situacao> situacaoes = new ArrayList<Situacao>();
//
//            for (Situacao situacao : entity.getSituacoes()) {
//                situacao.setProjeto(entity);
//                situacaoServico.save(situacao);
//                situacaoes.add(situacao);
//            }
//
//            entity.setSituacoes(situacaoes);
//        }
//
//        if (!entity.getLancamentos().isEmpty()) {
//
//            List<Lancamento> lancamentos = new ArrayList<Lancamento>();
//
//            for (Lancamento lancamento : entity.getLancamentos()) {
//                lancamento.setProjeto(entity);
//                lancamentoServico.save(lancamento);
//                lancamentos.add(lancamento);
//            }
//            entity.setLancamentos(lancamentos);
//        }
    }

    @Override
    public void atualizar(Projeto entity) {

//        if (!entity.getSituacoes().isEmpty()) {
//
//            List<Situacao> situacaoes = new ArrayList<Situacao>();
//
//            for (Situacao situacao : entity.getSituacoes()) {
//
//                if (situacao.getId() != null) {
//                    situacao.setProjeto(entity);
//                    situacaoServico.save(situacao);
//                }
//
//                situacaoes.add(situacao);
//            }
//            entity.setSituacoes(situacaoes);
//        }
//
//        if (!entity.getLancamentos().isEmpty()) {
//
//            List<Lancamento> lancamentos = new ArrayList<Lancamento>();
//
//            for (Lancamento lancamento : entity.getLancamentos()) {
//
//                if (lancamento.getId() != null) {
//                    lancamento.setProjeto(entity);
//                    lancamentoServico.save(lancamento);
//                }
//
//                lancamentos.add(lancamento);
//            }
//            entity.setLancamentos(lancamentos);
//        }

        super.atualizar(entity);
    }

//    /**
//     * Pesquisa todos os 10 últimos registros inseridos no banco
//     *
//     * @return 10 registros
//     */
//    public List<Projeto> findLimit() {
//        Usuario usuario = usuarioServico.getCurrentUser();
//
//        String sql = "SELECT p FROM Projeto p JOIN p.acompanhantes a "
//                + "WHERE a.id = :usuarioID"
//                + "order by p.id desc ";
//
//        Query query = getEntityManager().createQuery(sql).setMaxResults(10);
//
//        query.setParameter("usuarioID", usuario.getId());
//
//        return query.getResultList();
//    }
    /**
     * Pesquisar todos os N últimos registros inseridos no banco
     *
     * @param limite quantidade de registros a serem pesquisados
     * @return N registros, onde N equivale a quantidade informada por parâmetro
     */
    @Override
    public List<Projeto> findLimit(Integer limite) {
        if (limite == null || limite < 0) {
            limite = 10;
        }
        if (usuarioServico.isAdmin()) {
            return super.findLimit(limite);
        }

        Usuario usuario = usuarioServico.getCurrentUser();
        System.err.println(usuario);

        String sql = "SELECT p FROM Projeto p "
                + "JOIN p.acompanhantes a "
                + "WHERE a.id = :usuarioID "
                + "order by a.id desc";

        Query query = getEntityManager().createQuery(sql).setMaxResults(limite);
        query.setParameter("usuarioID", usuario.getId());

        return query.getResultList();
    }

    public Projeto findProjetoBySituacao(ProjetoStatus projetoStatus) {

        try {
            String sql = " SELECT distinct p FROM Projeto p JOIN p.situacoes s ";

            sql += "WHERE s.id = (select MAX(st.id) from Situacao st JOIN st.projeto pr where pr.id = p.id) ";

            if (projetoStatus != null) {
                sql += "and s.projetoStatus = :situacao ";
            }

            Query query = getEntityManager().createQuery(sql);
            query.setParameter("situacao", projetoStatus);

            return (Projeto) query.getSingleResult();

        } catch (NoResultException e) {
            e.printStackTrace();
            return null;
        }
    }

    public void report(Projeto p) {
        List<Projeto> lst = new ArrayList<Projeto>();
        lst.add(p);
        HashMap<String, Object> parametros = new HashMap<String, Object>();

        URL subreport = Thread.currentThread().getContextClassLoader().getResource("br/com/foxinline/reports/projetos_subreport.jasper");
        final String sub = subreport.toString().replace("projetos_subreport.jasper" + "", "");
        parametros.put("SUBREPORT_DIR", sub);

        RelatorioServico.genReport(parametros,
                lst, Relatorios.PROJETO);

    }

    public void reportAll(List<Projeto> p) {

        HashMap<String, Object> parametros = new HashMap<String, Object>();

        URL subreport = Thread.currentThread().getContextClassLoader().getResource("br/com/foxinline/reports/projetos_subreport.jasper");
        final String sub = subreport.toString().replace("projetos_subreport.jasper" + "", "");
        parametros.put("SUBREPORT_DIR", sub);

        RelatorioServico.genReport(parametros, p, Relatorios.PROJETO);

    }

    @Override
    public List<Projeto> pesquisarTodos() {
        if (usuarioServico.isAdmin()) {
            return super.pesquisarTodos();
        }

        Usuario usuario = usuarioServico.getCurrentUser();

        String sql = "SELECT p FROM Projeto p "
                + "JOIN p.acompanhantes a "
                + "WHERE a.id = :usuarioID";


        Query query = getEntityManager().createQuery(sql);
        query.setParameter("usuarioID", usuario.getId());

        return query.getResultList();
    }
}
